package org.test.swt;



import java.util.logging.Logger;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import com.iconic.richtexteditor.IStyledTextWidgetImageCreator;
import com.iconic.richtexteditor.RichTextEditorWidget;
import com.iconic.richtexteditor.RichTextEditorWidgetBasicImageCreator;
import com.iconic.richtexteditor.RichTextEditorWidgetFeatureSet;
import com.iconic.richtexteditor.html.HTMLTextEditorWidget;
import com.iconic.richtexteditor.html.HTMLTextModel;



public class HTMLTextEditorExample {



	private static final Logger logger = Logger.getLogger(HTMLTextEditorExample.class.getName());

	

//	private static final String iconsDirPath = "../RichTextEditorWidgetIcons/16x16/bmp";

	private static final String iconsDirPath = "../RichTextEditorWidgetIcons/16x16/png";

//	private static final String iconsDirPath = "../RichTextEditorWidgetIcons/24x24/bmp";

//	private static final String iconsDirPath = "../RichTextEditorWidgetIcons/24x24/png";

	

	private static final String HTML_LINE_BREAK = "<br/>";

	

	private static final String testText =

		"Normal <b>bold</b> <i>italic</i> <u>underline</u> <del>strikeout</del>" + HTML_LINE_BREAK +

		"This is another line." + HTML_LINE_BREAK +

		"This is the last line.";



	private static final int SHELL_WIDTH = 600;

	private static final int SHELL_HEIGHT = 500;

	

	private final Display display;

	private final Shell shell;

	private final GridLayout shellLayout;

	private HTMLTextEditorWidget htmlTextEditorWidget;

	private Button extractHTMLButton;

	private Text htmlText;

	

	public static void main(String[] args) {

		RichTextEditorWidget.setRegistrationKey("your registration key");

		HTMLTextEditorExample richTextEditorWidgetTest = new HTMLTextEditorExample();

		richTextEditorWidgetTest.start();

	}



	private void start() {

		shell.setVisible(true);

		while (!shell.isDisposed()) {

			if (!display.readAndDispatch()) {

				display.sleep();

			}

		}

		display.dispose();

	}



	public HTMLTextEditorExample() {

		display = new Display();

		shell = new Shell(display);

		

		shellLayout = new GridLayout();

		shellLayout.numColumns = 1;

		shellLayout.verticalSpacing = 1;

		shell.setLayout(shellLayout);

		

		shell.setText("Rich text editor");

		int shellWidth = SHELL_WIDTH;

		int shellHeight = SHELL_HEIGHT;

		shell.setSize(shellWidth, shellHeight);

		shell.setLocation(20, 20);

		

		createAndAddHTMLTextEditorWidget();

		createAndAddExtractHTMLButton();

		createAndAddHTMLTextAreaWidget();

	}

	

	private void createAndAddHTMLTextEditorWidget() {

		final String menuHeaderName = "Edit";

		final boolean preventTypingOfHTMLTags = true;

		final int compositeStyle = SWT.BORDER;

		final int toolBarStyle = SWT.NULL;

		final int styledTextStyle = SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.WRAP;



//		RichTextEditorWidgetFeatureSet featureSet = new RichTextEditorWidgetFeatureSet(

//				RichTextEditorWidgetFeatureSet.BOLD_ITALIC_UNDERLINE_FEATURES,

//				RichTextEditorWidgetFeatureSet.CUT_COPY_PASTE_FEATURES);

//		featureSet = new RichTextEditorWidgetFeatureSet(

//				featureSet,

//				RichTextEditorWidgetFeatureSet.CLEAR_STYLES_FEATURE);

		RichTextEditorWidgetFeatureSet featureSet = RichTextEditorWidgetFeatureSet.ALL_FEATURES;

		IStyledTextWidgetImageCreator imageCreator = new RichTextEditorWidgetBasicImageCreator(

				iconsDirPath, false);

		

		Composite parent = shell;

		htmlTextEditorWidget = new HTMLTextEditorWidget(

				featureSet,

				imageCreator,

				parent,

				menuHeaderName,

				preventTypingOfHTMLTags,

				compositeStyle,

				toolBarStyle,

				styledTextStyle);

		

		GridData gridData = new GridData();

		gridData.grabExcessHorizontalSpace = true;

		gridData.grabExcessVerticalSpace = true;

		gridData.horizontalAlignment = SWT.BEGINNING;

		gridData.verticalAlignment = SWT.BEGINNING;

		gridData.minimumWidth = 200;

		gridData.minimumHeight = 50;

		htmlTextEditorWidget.setLayoutData(gridData);

		

		HTMLTextModel htmlTextModel = new HTMLTextModel(testText);

		htmlTextEditorWidget.setFormattedText(htmlTextModel);

		

		shell.layout();

	}



	private void createAndAddExtractHTMLButton() {

		extractHTMLButton = new Button(shell, SWT.BORDER);

		extractHTMLButton.setText("Extract as HTML");

		SelectionAdapter extractButtonAdapter = new SelectionAdapter() {

			@Override

			public void widgetSelected(SelectionEvent e) {

				if (!htmlTextEditorWidget.isDisposed()) {

					handleExtractHTMLButton();

				}

			}

		};

		extractHTMLButton.addSelectionListener(extractButtonAdapter);

	}

	

	private void createAndAddHTMLTextAreaWidget() {

		htmlText = new Text(shell, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY | SWT.V_SCROLL | SWT.H_SCROLL);

		

		GridData gridData = new GridData();

		gridData.grabExcessHorizontalSpace = false;

		gridData.grabExcessVerticalSpace = false;

		gridData.horizontalAlignment = SWT.BEGINNING;

		gridData.verticalAlignment = SWT.BEGINNING;

		gridData.widthHint = SHELL_WIDTH - 100;

		gridData.heightHint = 100;

		htmlText.setLayoutData(gridData);

	}

	

	private void handleExtractHTMLButton() {

		if (logger.isLoggable(java.util.logging.Level.INFO)) {

			logger.info("### Handling extract button pressed...");

		}

		HTMLTextModel htmlTextModel = htmlTextEditorWidget.getFormattedTextModel();

		String formattedText = htmlTextModel.getHtml();

		if (logger.isLoggable(java.util.logging.Level.INFO)) {

			logger.info("### Formatted text is as follows:\n" + formattedText);

		}

		String html = htmlTextModel.getHtml();

		htmlText.setText(html);

	}

	

}
